import config from './config'
import { refreshToken } from '../api/user'
import { generateRandomKey, encryptBase64, encryptWithAes, encrypt } from './jsencrypt'

// 是否显示重新登录对话框
const isRelogin = { show: false };
// 是否正在刷新token
let isRefreshing = false;
// 存储待执行的请求
let pendingRequests = [];

// 错误信息处理
const showError = (message) => {
  uni.showToast({
    title: message || '请求错误',
    icon: 'none',
    duration: 2000
  })
}

// 处理token刷新后的回调
function handleRefreshedToken(newToken) {
    // 保存新token
    uni.setStorageSync('Token', 'Bearer ' + newToken);
    // 执行所有等待的请求
    pendingRequests.forEach(callback => callback(newToken));
    pendingRequests = [];
}

// 格式化参数
function formatParams(data) {
  if (!data) return ''
  const params = []
  for (const key in data) {
    if (data.hasOwnProperty(key) && data[key] !== undefined && data[key] !== null) {
      params.push(key + '=' + encodeURIComponent(data[key]))
    }
  }
  return params.join('&')
}

export default function request(options){
    // 确保options是对象
    options = options || {}
    options.params = options.params || {}
    
    // 设置默认值
    options.method = options.method?.toUpperCase() || 'GET'
    options.data = options.data || {}
    options.header = options.header || {}
    options.timeout = options.timeout || config.timeout || 10000
    
    // 设置content-type
    if (!options.header['Content-Type']) {
      options.header['Content-Type'] = 'application/json'
    }
    
    // 根据withToken参数决定是否添加token
    if (options.withToken !== false) {
      const token = uni.getStorageSync('Token') || ''
      if (token) {
        options.header['Authorization'] = token
        console.log('请求添加了token授权头')
      }
    } else {
      // 明确移除可能存在的Authorization头
      delete options.header['Authorization']
      console.log('请求明确设置不携带token')
    }
    
    // 处理加密请求 (RuoYi框架支持的加密机制)
    if (options.withEncrypt) {
      console.log('开始加密请求处理');
      // 生成16位随机AES密钥
      const aesKey = generateRandomKey();
      console.log('生成AES密钥:', aesKey);
      // 对AES密钥进行Base64编码
      const base64AesKey = encryptBase64(aesKey);
      console.log('AES密钥Base64编码后:', base64AesKey);
      // 使用RSA加密Base64编码后的AES密钥
      const encryptedAesKey = encrypt(base64AesKey);
      console.log('RSA加密后的AES密钥:', encryptedAesKey);
      
      // 设置加密请求头
      options.header['encrypt-key'] = encryptedAesKey;
      console.log('设置encrypt-key请求头');
      
      // 对请求体进行AES加密
      if (options.data && typeof options.data === 'object') {
        console.log('原始请求数据:', options.data);
        const jsonData = JSON.stringify(options.data);
        console.log('JSON字符串化后的数据:', jsonData);
        options.data = encryptWithAes(jsonData, aesKey);
        console.log('AES加密后的数据:', options.data);
        console.log('请求数据已加密');
      }
      
      console.log('加密请求已处理，设置了加密密钥和请求体加密');
    }
    
    // 处理GET请求的参数
    let url = config.baseUrl + options.url;
    if (options.method === 'GET' && options.params) {
        const queryString = formatParams(options.params)
        if (queryString) {
            url += (url.includes('?') ? '&' : '?') + queryString;
        }
    }
    
    return new Promise((resolve, reject)=>{
        uni.request({
            url: url,
            method: options.method,
            data:options.data,
            header:options.header,
            timeout:options.timeout,
            success:(res)=>{
                // 检查响应数据格式
                const response = res.data || {}
                // 统一处理RuoYi框架的状态码
                const code = response.code || 200
                
                // 处理未授权错误
                if (code === 401) {
                    // 防止重复显示登录对话框
                    if (!isRelogin.show) {
                        isRelogin.show = true
                        
                        // 弹出重新登录确认框
                        uni.showModal({
                            title: '系统提示',
                            content: '登录状态已过期，您可以继续留在该页面，或者重新登录',
                            confirmText: '重新登录',
                            cancelText: '取消',
                            success: (modalRes) => {
                                if (modalRes.confirm) {
                                    // 清除登录信息
                                    uni.removeStorageSync('Token')
                                    uni.removeStorageSync('UserInfo')
                                    // 跳转到登录页
                                    uni.navigateTo({
                                        url: '/pages/mine/login',
                                        complete: () => {
                                            isRelogin.show = false
                                        }
                                    })
                                } else {
                                    isRelogin.show = false
                                }
                            }
                        })
                    }
                    
                    reject(new Error('登录状态已过期'))
                    return
                }
                
                // 处理业务错误
                if (code !== 200) {
                    showError(response.msg || '操作失败')
                    reject(response)
                    return
                }
                
                // 成功响应
                resolve(response)
            },
            fail:(err)=>{
                // 网络错误处理
                if (err.statusCode === 401) {
                    // 未登录状态处理
                    if (!uni.getStorageSync('Token')) {
                        if (!isRelogin.show) {
                            isRelogin.show = true
                            uni.navigateTo({
                                url: '/pages/mine/login',
                                complete: () => {
                                    isRelogin.show = false
                                }
                            })
                        }
                    }
                }
                
                showError(err.errMsg || '网络错误')
                reject(err)
            }
        })
    })
}